package com.yupi.springbootinit.manager.limiting;

import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Service;

import java.sql.SQLOutput;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * Created With IntelliJ IDEA.
 * Descriptions:固定窗口限流算法
 *
 * 优点：
 *  简单
 * 缺点：
 *  临界问题：假设限流阀值为5个请求，单位时间窗口是1s,如果我们在单位时间内的前0.8-1s和1-1.2s，分别并发5个请求。虽然都没有超过阀值，
 *  但是如果算0.8-1.2s,则并发数高达10，已经超过单位时间1s不超过5阀值的定义啦。
 * author: Mr.Du
 * Date: 2023/7/5
 * Time: 14:22
 */


@Service
@ConfigurationProperties(prefix = "fixed.window.limiter")
@NoArgsConstructor
@Data
public class FixedWindowRateLimiter {
    
    private volatile int limit; // 限制的请求数量
    private volatile long windowSize; // 时间窗口的大小，以毫秒为单位
    private volatile long lastRequestTime; // 时间窗口的大小，以毫秒为单位
    private volatile long count;
    
    
    public synchronized boolean allowRequest(String userId) {
        long currentTime = System.currentTimeMillis();
        if(currentTime - lastRequestTime > windowSize){
            count = 0;
            lastRequestTime = currentTime;
        }
        if(count < limit){
            count++;
            return true;
        }
        return false;
        
    }
}


